/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.LinkedList;
import model.dto.LoteMudaDTO;

/**
 *
 * @author Gabriel
 */
public class LoteMudaDAO extends DAO {

    private static final String SELECT_LOTE_MUDA =
                                        ""; //TODO: Inserir o select de negócio aqui

    public LoteMudaDAO() throws SQLException, ClassNotFoundException {
        super();
    }

    private LoteMudaDTO getLoteMudaResultSet(ResultSet rs) throws SQLException {
        LoteMudaDTO loteMudaDTO = new LoteMudaDTO();
        loteMudaDTO.setDataPlantio(rs.getDate("Data_Plantio"));
        loteMudaDTO.setFaseMudas(rs.getInt("Id_Fase_Mudas"), rs.getString("Descricao_Fase_Mudas"));
        loteMudaDTO.setId(rs.getInt("Id"));
        loteMudaDTO.setLocalArmazenamento(rs.getString("Local_Armazenamento"));
        loteMudaDTO.setMediaAltura(rs.getDouble("Media_Altura"));
        loteMudaDTO.setQtdMudas(rs.getInt("Qtd_Mudas"));
        loteMudaDTO.setEspecie(rs.getInt("Id_Especie"), rs.getString("Nome_Cientifico_Especie"), rs.getString("Nome_Vulgar_Especie"));
        return loteMudaDTO;
    }

    private LinkedList<LoteMudaDTO> getLotesMudaResultSet(ResultSet rs) throws SQLException {
        LinkedList<LoteMudaDTO> loteMudaDTOs = new LinkedList<LoteMudaDTO>();
        while (rs.next()) {
            loteMudaDTOs.add(getLoteMudaResultSet(rs));
        }
        return loteMudaDTOs;
    }

    public LinkedList<LoteMudaDTO> pesquisaLoteMuda(Integer id,
                                                    String nomeEspecie,
                                                    Date dataPlantio,
                                                    String faseMuda,
                                                    String localArmazenamento,
                                                    Integer qtdMudas) throws SQLException {
        sql = SELECT_LOTE_MUDA;

        if (id != null) {
            sql += " AND Id = " + id + "\n";
        }

        if (nomeEspecie != null) {
            sql += " AND (nome_cientifico like '%" + nomeEspecie + "%' OR nome_vulgar like '%" + nomeEspecie + "%')\n";
        }

        if (dataPlantio != null) {
            sql += " AND Data_Plantio = " + dataPlantio + "\n";
        }

        if (faseMuda != null) {
            sql += " AND d.descricao = " + faseMuda + "\n";
        }

        if (localArmazenamento != null) {
            sql += " AND Local_Armazenamento like '%" + localArmazenamento + "%'\n";
        }

        sql += ";";

        resultSet = connector.executeSelectQuery(sql);

        return getLotesMudaResultSet(resultSet);

    }

    public void insereLoteMuda(LoteMudaDTO loteMudaDTO) throws SQLException {
        sql = "insert into Lote_Muda(Media_Altura,Data_Plantio,Fase_Mudas,Qtd_Mudas,Local_Armazenamento,Id_Especie)" +
              "values("+loteMudaDTO.getMediaAltura()+","+loteMudaDTO.getDataPlantio()+","+loteMudaDTO.getIdFaseMudas()+","+loteMudaDTO.getQtdMudas()+","+loteMudaDTO.getLocalArmazenamento()+","+loteMudaDTO.getIdEspecie()+")";
        connector.executeInsertQuery(sql);
    }

    public void atualizaLoteMuda(LoteMudaDTO loteMudaDTO,
                                 boolean atualizaDataPlantio) throws SQLException {
        /* O booleano abaixo informa se a instrução SQL ainda não recebeu nenhuma
           atualização. Desta maneira é possível saber se a condição virá precedida
           de uma vírgula ou não. */
        boolean naoPossuiAtualizacaoAinda = true;

        sql = "UPDATE LOTE_MUDA\n" +
              "SET ";

        if (atualizaDataPlantio) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Data_Plantio = " + loteMudaDTO.getDataPlantio() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Data_Plantio = " + loteMudaDTO.getDataPlantio() + "\n";
            }
        }

        sql += "WHERE Id = " + loteMudaDTO.getId() + ";";

        connector.executeUpdateQuery(sql);
    }
}
